home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sun4c.md / standalloc.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  7KB  |  294 lines

  1. /*    standalloc.c    1.22    88/02/08    */
  2.  
  3. /*
  4.  * Copyright (c) 1985 by Sun Microsystems, Inc.
  5.  */
  6. #define DVMA_BASE 0xfff00000
  7. /*
  8.  * standalloc.c
  9.  *
  10.  * ROM Monitor's routines for allocating resources needed on a temporary
  11.  * basis (eg, for initialization or for boot drivers).
  12.  *
  13.  * Note, all requests are rounded up to fill a page.  This is not a
  14.  * malloc() replacement!
  15.  */
  16.  
  17. /* This flag causes printfs */
  18. #undef PD
  19.  
  20. #include "cpu.map.h"
  21. #include "cpu.addrs.h"
  22. #include "saio.h"
  23. #include "sunromvec.h"
  24. /*
  25.  * Artifice so standalone code uses same variable names as monitor's
  26.  * for debugging.  FIXME?  Or leave this way?
  27.  */
  28. struct globram {
  29.     char *g_nextrawvirt;
  30.     char *g_nextdmaaddr;
  31.     struct pgmapent g_nextmainmap;
  32. } gp[1];
  33.  
  34.  
  35. /*
  36.  * Valid, supervisor-only, memory page's map entry.
  37.  * (To be copied to a map entry and then modified.)
  38.  */
  39. #ifdef sun2
  40. struct pgmapent mainmapinit =
  41.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0};
  42. #else
  43. struct pgmapent mainmapinit = 
  44.     {1, PMP_SUP, VPM_MEMORY_NOCACHE, 0, 0, 0, 0};
  45. #endif
  46.  
  47. /*
  48.  * Say Something Here FIXME
  49.  */
  50. char *
  51. resalloc(type, bytes)
  52.     enum RESOURCES type;
  53.     register unsigned bytes;
  54. {
  55.     register char *    addr;    /* Allocated address */
  56.     register char *    raddr;    /* Running addr in loop */
  57.  
  58.     /* Initialize if needed. */
  59.     if (gp->g_nextrawvirt == 0) {
  60. #ifdef sun2
  61.         reset_alloc(0x220000);
  62. #endif
  63. #if defined(sun3) || defined(sun4)
  64.         reset_alloc(0x700000);
  65. #endif sun3 || sun4
  66.     }
  67.  
  68. #ifdef PD
  69. printf("resalloc(%x, %x) %x %x %x\n", type, bytes,
  70.     gp->g_nextrawvirt, gp->g_nextdmaaddr,*(int*)&(gp->g_nextmainmap));
  71. #endif PD
  72.     if (bytes == 0)
  73.         return (char *)0;
  74.  
  75.     bytes = (bytes + (BYTESPERPG - 1)) & ~(BYTESPERPG - 1);
  76.  
  77.     switch (type) {
  78.  
  79.     case RES_RAWVIRT:
  80.         addr = gp->g_nextrawvirt;
  81.         gp->g_nextrawvirt += bytes;
  82.         return addr;
  83.  
  84.     case RES_DMAVIRT:
  85.         addr = gp->g_nextdmaaddr;
  86.         gp->g_nextdmaaddr += bytes;
  87.         return addr;
  88.  
  89.     case RES_MAINMEM:
  90.         addr = gp->g_nextrawvirt;
  91.         gp->g_nextrawvirt += bytes;
  92.         break;
  93.  
  94.     case RES_DMAMEM:
  95.         addr = gp->g_nextdmaaddr;
  96.         gp->g_nextdmaaddr += bytes;
  97.         break;
  98.  
  99.     default:
  100.         return (char *)0;
  101.     }
  102.     
  103.     /*
  104.      * Now map in main memory.
  105.      * Note that this loop goes backwards!!
  106.      */
  107. #ifdef PD
  108. printf("mapping to %x returning %x gp %x\n", *(int*)&gp->g_nextmainmap, addr, gp);
  109. #endif
  110.     for (raddr = addr;
  111.          bytes > 0;
  112.          raddr += BYTESPERPG, bytes -= BYTESPERPG,
  113.           gp->g_nextmainmap.pm_page -= 1) {
  114.         setpgmap(raddr, *(int *)&gp->g_nextmainmap);
  115.         bzero((caddr_t)raddr, BYTESPERPG);
  116.     } 
  117.  
  118.     return addr;
  119. }
  120.  
  121. #ifdef sun2
  122. struct pgmapent devmaps[] = {
  123. /* MAINMEM */
  124.     {1, PMP_SUP, MPM_MEMORY, 0, 0, 0, 0},        
  125. /* OBIO */
  126.     {1, PMP_SUP, MPM_IO, 0, 0, 0, 0},            
  127. /* MBMEM */
  128.     {1, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  129. /* MBIO */
  130.     {1, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  131. /* VME16A16D */
  132.     {1, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  133. /* VME16A32D -- invalid */
  134.     {0, PMP_SUP, VPM_VME8, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  135. /* VME24A16D -- kludge low 8 megs only */
  136.     {1, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  137. /* VME24A32D -- invalid */
  138.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  139. /* VME32A16D -- invalid */
  140.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  141. /* VME32A32D -- invalid */
  142.     {0, PMP_SUP, VPM_VME0, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  143. };
  144. #endif sun2
  145.  
  146. #ifdef sun3
  147. struct pgmapent devmaps[] = {
  148. /* MAINMEM */
  149.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0},        
  150. /* OBIO */
  151.     {1, PMP_SUP, VPM_IO, 0, 0, 0, 0},            
  152. /* MBMEM */
  153.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  154. /* MBIO */
  155.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  156. /* VME16A16D */
  157.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  158. /* VME16A32D */
  159.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  160. /* VME24A16D */
  161.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  162. /* VME24A32D */
  163.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  164. /* VME32A16D */
  165.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  166. /* VME32A32D */
  167.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  168. };
  169. #endif sun3
  170.  
  171. #ifdef sun4
  172. struct pgmapent devmaps[] = {
  173. /* MAINMEM */
  174.     {1, PMP_SUP, VPM_MEMORY, 0, 0, 0, 0},        
  175. /* OBIO */
  176.     {1, PMP_SUP, VPM_IO, 0, 0, 0, 0},            
  177. /* MBMEM */
  178.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  179. /* MBIO */
  180.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  181. /* VME16A16D */
  182.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  183. /* VME16A32D */
  184.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},        
  185. /* VME24A16D */
  186.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  187. /* VME24A32D */
  188.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},        
  189. /* VME32A16D */
  190.     {1, PMP_SUP, VPM_VME16, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  191. /* VME32A32D */
  192.     {1, PMP_SUP, VPM_VME32, 0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},        
  193. };
  194. #endif sun4
  195.  
  196. /*
  197.  * devalloc() allocates virtual memory and maps it to a device
  198.  * at a specific physical address.
  199.  *
  200.  * It returns the virtual address of that physical device.
  201.  */
  202. char *
  203. devalloc(devtype, physaddr, bytes)
  204.     enum MAPTYPES    devtype;
  205.     register char *        physaddr;
  206.     register unsigned    bytes;
  207. {
  208.     char *        addr;
  209.     register char *    raddr;
  210.     register int    pages;
  211.     struct pgmapent    mapper;
  212.  
  213. #ifdef PD
  214. printf("devalloc(%x, %x, %x) ", devtype, physaddr, bytes);
  215. #endif
  216.     if (!bytes)
  217.         return (char *)0;
  218.  
  219.     pages = bytes + ((int)(physaddr) & (BYTESPERPG-1));
  220.     addr = resalloc(RES_RAWVIRT, pages);
  221.     if (!addr)
  222.         return (char *)0;
  223.  
  224.     mapper = devmaps[(int)devtype];        /* Set it up first */
  225.     mapper.pm_page += (int)(physaddr) >> BYTES_PG_SHIFT;
  226.  
  227.     for (raddr = addr;
  228.          pages > 0;
  229.          raddr += BYTESPERPG, pages -= BYTESPERPG,
  230.           mapper.pm_page += 1) {
  231. #ifdef PD
  232. printf("mapping to %x ", *(int *)&mapper);
  233. #endif
  234.         setpgmap(raddr, *(int *)&mapper);
  235.     } 
  236.  
  237. #ifdef PD
  238. printf("returns roughly %x\n", addr);
  239. #endif
  240.     return addr + ((int)(physaddr) & (BYTESPERPG-1));
  241. }
  242.  
  243. /*
  244.  * reset_alloc() does all the setup and all the releasing for the PROMs.
  245.  */
  246. reset_alloc(memsize)
  247.     unsigned memsize;
  248. {
  249. #ifdef sun2
  250.     int    i;
  251.     struct bootparam *bp;
  252.     int    *mem_p;
  253.     int    memory_size;
  254.  
  255.     bp = *(romp->v_bootparam);
  256.     mem_p = (int *)&(bp->bp_strings[96]);
  257.     memory_size = *mem_p;
  258.     if (memory_size)
  259.         memsize = memory_size;
  260.     *mem_p = memory_size + 0x20000;
  261.  
  262.     gp->g_nextrawvirt = (char *)0x160000;
  263. #endif
  264. #ifdef sun3
  265.     int i, addr, pmeg;
  266.  
  267.     gp->g_nextrawvirt = (char *)0x200000;
  268.     /*
  269.      * The monitor only allocates as many PMEGs as there is real
  270.      * memory so we have to set up more PMEGs for virtual memory
  271.      * on machines with only 2 megabytes.
  272.      */
  273.     for (i=0; i < 0x100000; i += PGSPERSEG*BYTESPERPG) {    /* 1 Meg */
  274.         addr = (int)gp->g_nextrawvirt + i;
  275.         pmeg = addr / (PGSPERSEG*BYTESPERPG);
  276.         setsegmap(addr, pmeg);
  277.     }
  278. #endif
  279. #ifdef sun4
  280.     /*
  281.      * The booter loads itself at 2 Meg so we add an extra Meg to
  282.      * get to a place to allocate virtual addresses and still have pmegs.
  283.      * This assumes that the minimum memory size for sun4 is 4 Meg.
  284.      */
  285.     gp->g_nextrawvirt = (char *)0x300000;
  286. #endif sun4
  287.     gp->g_nextdmaaddr = DVMA_BASE;
  288.     gp->g_nextmainmap = mainmapinit;
  289.     gp->g_nextmainmap.pm_page = (memsize>>BYTES_PG_SHIFT) - 1;
  290. #ifdef PD
  291. printf("reset_alloc(%x) %x %x %x\n", memsize, *(int *)&mainmapinit, gp, *(int*)&gp->g_nextmainmap);
  292. #endif
  293. }
  294.